﻿
/**
------------------------------------------------------------
* NGUYEN SY BACH
* bit.mta@gmail.com
* Hoc Vien Ky Thuat Quan Su
------------------------------------------------------------
***	source cac function se dung trong chuong trinh
------------------------------------------------------------
*/
#include "nsb_functions.h"
#include "nsb_helper.h"

void help()
{
	printf("\n\n----------- HUONG DAN -----------\n"
		"<filename>: Ten duong dan anh. D:\\img1.bmp\n"
		"[/f]: 6 tham so cua affice. [1 0 0 0 1 0]\n"
		"[/m]: phuong phap tai che mau. [NEARESTNEIGHBOR | BILINEAR | BICUBIC]\n"
		"[/s]: kich thuoc mau anh. [512 512]\n"
		"[/p]: lua chon che do. [CPU | GPU | OPENMP]\n"
		"[/t]: voi GPU, so threads 2d tren mot block. [8 8]\n"
		"[/b]: voi GPU, so blocks 2d grid. [16 16]\n");
}

void Inv(const double f[6], double g[6])
{
	g[0] = f[4];
	g[1] = -f[1];
	g[2] = f[1] * f[5] - f[2] * f[4];
	g[3] = -f[3];
	g[4] = f[0];
	g[5] = f[2] * f[3] - f[0] * f[5];
	for (int i = 0; i < 6; i++)
		g[i] /= (f[0] * f[4] - f[1] * f[3]);
}

// ---------- Xác định Box của ảnh ----------
// u0: tạo độ cột
// v0: tạo độ hàng của ảnh
// width: chiều rộng, height là chiều cao
// f: là con trỏ các tham số biến đổi
// Hàm trả về giá trị nhỏ nhất và lớn nhất của x và y;
void GetBox(int u0, int v0, int width, int height, const double *f,
	double &minx, double &miny, double &maxx, double &maxy)
{
	double g[6];
	Inv(f, g);
	Point2f goc[4];
	goc[0] = Point2f(
		f[0] * u0 + f[1] * v0 + f[2],
		f[3] * u0 + f[4] * v0 + f[5]);
	goc[1] = Point2f(
		f[0] * (u0 + width) + f[1] * v0 + f[2],
		f[3] * (u0 + width) + f[4] * v0 + f[5]);
	goc[2] = Point2f(
		f[0] * (u0 + width) + f[1] * (v0 + height) + f[2],
		f[3] * (u0 + width) + f[4] * (v0 + height) + f[5]);
	goc[3] = Point2f(
		f[0] * u0 + f[1] * (v0 + height) + f[2],
		f[3] * u0 + f[4] * (v0 + height) + f[5]);
	minx = maxx = goc[0].x;
	miny = maxy = goc[0].y;
	for (int i = 0; i < 4; ++i){
		if (goc[i].x > maxx)
			maxx = goc[i].x;
		if (goc[i].x < minx)
			minx = goc[i].x;
		if (goc[i].y > maxy)
			maxy = goc[i].y;
		if (goc[i].y < miny)
			miny = goc[i].y;
	}
}